home *** CD-ROM | disk | FTP | other *** search
- /*
- * AppleEvents.c - handle Apple Event -- what a lot of work
- *
- * Most of this code is straight out of IM VI
- */
-
- #include "RevRdist.h"
- #include "AppleEvents.h"
-
- pascal OSErr myAEHandler (AppleEvent *ae, AppleEvent *reply, Longint refcon);
- OSErr MyGotRequiredParams(AppleEvent *ae);
- OSErr MyOpenFile(FSSpec *fss);
- OSErr DoHighLevelEvent (EventRecord *theEvent);
- OSErr init_AppleEvent(Boolean);
-
- void doFileMenu (Integer);
-
-
- /*
- *=========================================================================
- * init_AppleEvent(flag) - register/unregister handlers
- * entry: flag = true to register handlers, false to remove them
- * (quit handler is not removed once installed)
- *=========================================================================
- */
- OSErr
- init_AppleEvent(Boolean flag)
- {
- OSErr error;
-
- if (flag)
- {
- error = AEInstallEventHandler (kCoreEventClass, kAEOpenApplication,
- myAEHandler, kAEOpenApplication, false);
- if (error == 0)
- error = AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments,
- myAEHandler, kAEOpenDocuments, false);
- if (error == 0)
- error = AEInstallEventHandler (kCoreEventClass, kAEQuitApplication,
- myAEHandler, kAEQuitApplication, false);
- }
- else
- {
- error = AERemoveEventHandler (kCoreEventClass, kAEOpenApplication,
- myAEHandler, false);
- if (error == 0)
- error = AERemoveEventHandler (kCoreEventClass, kAEOpenDocuments,
- myAEHandler, false);
- }
- return error;
- }
-
-
-
- /*
- *=========================================================================
- * myAEHandler(ae, reply, refcon) - handle Apple Event
- * entry: ae = ptr to event
- * reply = ptr to reply
- * refcon = event type
- * returns: OSErr
- *=========================================================================
- */
- pascal
- OSErr
- myAEHandler (AppleEvent *ae, AppleEvent *reply, Longint refcon)
- {
- OSErr error;
- FSSpec myFSS;
- AEDescList docList;
- Longint index, itemsInList;
- Size actualSize;
- AEKeyword keywd;
- DescType returnedType;
-
- Clue1 = "\pmyAEHandler";
- switch (refcon)
- {
- case kAEOpenApplication:
- error = MyGotRequiredParams (ae);
- break;
-
- case kAEQuitApplication:
- error = MyGotRequiredParams (ae);
- if (error == 0)
- doFileMenu(FILE_QUIT);
- break;
-
- case kAEOpenDocuments:
- ZERO(docList);
- Clue1 = "\pAEGetParamDesc";
- error = AEGetParamDesc(ae, keyDirectObject, typeAEList, &docList);
- if (error == 0)
- error = MyGotRequiredParams (ae);
- if (error == 0)
- {
- Clue1 = "\pAECountItems";
- error = AECountItems (&docList, &itemsInList);
- }
- if (error == 0)
- if (itemsInList < 1)
- {
- Clue1 = "\pitemsInList";
- error = errAEEventNotHandled;
- }
- for (index = 1; error == 0 && index <= itemsInList; index++)
- {
- if (error == 0)
- {
- Clue1 = "\pAEGetNthPtr";
- error = AEGetNthPtr(&docList, index, typeFSS, &keywd, &returnedType,
- (Ptr)&myFSS, sizeof(myFSS), &actualSize);
- }
- if (error == 0)
- error = MyOpenFile(&myFSS);
- }
- (void) AEDisposeDesc(&docList);
- break;
-
- default:
- error = errAEEventNotHandled;
- }
- return error;
- }
-
-
-
- /*
- *=========================================================================
- * DoHighLevelEvent (theEvent) - handle high level event
- * entry: theEvent = ptr to event
- * returns: OSErr
- *=========================================================================
- */
- OSErr
- DoHighLevelEvent (EventRecord *theEvent)
- {
- OSErr error;
-
- Clue1 = "\pAEProcessAppleEvent";
- error = AEProcessAppleEvent (theEvent);
- if (error)
- {
- ClueID = error;
- panic (false, E_SYS, "\pDoHighLevelEvent", Clue1, nil);
- }
- return error;
- }
-
-
-
- /*
- *=========================================================================
- * MyGotRequiredParams(ae) - check that all required params fetched
- * entry: ae = ptr to Apple event
- * returns: OSErr
- *=========================================================================
- */
- OSErr
- MyGotRequiredParams(AppleEvent *ae)
- {
- OSErr error;
- DescType returnedType;
- Size actualSize;
-
- Clue1 = "\pMyGotRequiredParams";
- error = AEGetAttributePtr(ae, keyMissedKeywordAttr, typeWildCard,
- &returnedType, nil, 0, &actualSize);
- if (error == errAEDescNotFound)
- return 0;
- if (error == 0)
- return errAEEventNotHandled;
- return error;
- }
-
-
-
- /*
- *=========================================================================
- * MyOpenFile(fss) - squirrel away file spec for later
- * (Called during startup processing)
- * entry: fss = ptr to file system spec
- * returns: OSErr
- * File_list[] possibly modified
- *=========================================================================
- */
- OSErr
- MyOpenFile(FSSpec *fss)
- {
- OSErr error;
- file_info_t *fi;
- int j; /* File_list index */
- StringHandle sh; /* temp for file name */
- FInfo finfo; /* finder info for file */
- Str255 s; /* temp for full path name */
-
- Clue1 = "\pFSpGetFInfo";
- error = FSpGetFInfo(fss, &finfo);
- if (error)
- return error;
- switch (finfo.fdType)
- {
- case TYPE_PREF: j = FL_PREF; break;
- case TYPE_CONT: j = FL_DIST; break;
- case 'INIT': j = -1; Flags |= PF_STARTUP; break;
- default: j = -1; error = errAEEventNotHandled; break;
- }
- if (j >= 0)
- {
- fi = &File_list[j];
- error = getInfo (fss->name, fss->vRefNum, fss->parID, &fi->f_info);
- if (error == 0)
- {
- fi->f_vol = fss->vRefNum;
- fi->f_launch = true;
- fi->f_set = true;
- sh = fi->f_path;
- if (sh)
- DisposHandle ((Handle) sh);
- sh = 0;
- COPYPS (fss->name, s);
- (void) fullpath (s, fss->vRefNum, fss->parID);
- sh = (StringHandle) NewHandle ((Size) s[0] + 1);
- if (sh)
- COPYPS (s, *sh);
- else
- error = MemError ();
- fi->f_path = sh;
- }
- }
- return error;
- }
-